
/**
 * Clase que representa el problema de las garrafas
 *
 */
package Juegos;

import Estados.*;

public class Garrafas extends Juego {
	
	
	/**
	 * Constructor de la clase
	 */
	public Garrafas(Estado ini) {
                super(ini,6);
        }
	
	
	/**
	 * llena la garrafa de tres
	 * @return nuevo estado.
	 */
	public eGarrafas llena3(eGarrafas e){
		int[] situacion = e.getSituacion();
                situacion[0] = 3;
		return new eGarrafas(situacion[0], situacion[1]);
	}

        /**
	 * llena la garrafa de cuatro
	 * @return nuevo estado.
	 */
	public eGarrafas llena4(eGarrafas e){
		int[] situacion = e.getSituacion();
                situacion[1] = 4;
		return new eGarrafas(situacion[0], situacion[1]);
	}

         /**
	 * vacia la garrafa de cuatro
	 * @return nuevo estado.
	 */
	public eGarrafas vacia4(eGarrafas e){
		int[] situacion = e.getSituacion();
                situacion[1] = 0;
		return new eGarrafas(situacion[0], situacion[1]);
	}

         /**
	 * vacia la garrafa de cuatro
	 * @return nuevo estado.
	 */
	public eGarrafas vacia3(eGarrafas e){
		int[] situacion = e.getSituacion();
                situacion[0] = 0;
		return new eGarrafas(situacion[0], situacion[1]);
	}

         /**
	 * vierte el contenido de la garrafa de tres en la de cuatro
	 * @return nuevo estado.
	 */
	public eGarrafas vierte34(eGarrafas e){
		int[] situacion = e.getSituacion();
                if (situacion[0] > 0 && situacion[1] < 4){
                    int garrafa3 = situacion[0];
                    int garrafa4 = situacion[1];
                    while (garrafa4 < 4 || garrafa3 > 0){
                        garrafa3--;
                        garrafa4++;
                    }
                    situacion[0] = garrafa3;
                    situacion[1] = garrafa4;
                }
		return new eGarrafas(situacion[0], situacion[1]);
	}

         /**
	 * vierte el contenido de la garrafa de cuatro en la de tres
	 * @return nuevo estado.
	 */
	public eGarrafas vierte43(eGarrafas e){
		int[] situacion = e.getSituacion();
                situacion[0] = 0;
		return new eGarrafas(situacion[0], situacion[1]);
	}


	
	public int getOperadorInverso(int op){
		int inverso = op;
		switch(op){
		case 0:
			inverso = 2;
			break;
		case 1:
			inverso = 3;
			break;
		case 2:
			inverso = 0;
			break;
		case 3:
			inverso = 1;
		case 4:
			inverso = -1;
			break;
		case 5:
			inverso = -1;
			break;
		}
		return inverso;
	}
	

 public eGarrafas operar(int x, Estado in) {
        eGarrafas nuevo=null;
        eGarrafas e=(eGarrafas) in;
        switch(x){
            case 0:{
                nuevo=llena3(e);
                if(nuevo!=null) nuevo.setCoste(e.getCoste() + 1);
                break;
            }
            case 1:{
                nuevo=llena4(e);
                if(nuevo!=null) nuevo.setCoste(e.getCoste() + 1);
                break;
            }
            case 2:{
                nuevo=vacia3(e);
                if(nuevo!=null) nuevo.setCoste(e.getCoste() + 1);
                break;
            }
            case 3:{
                nuevo=vacia4(e);
                if(nuevo!=null) nuevo.setCoste(e.getCoste() + 1);
                break;
            }
            case 4:{
                nuevo=vierte34(e);
                if(nuevo!=null) nuevo.setCoste(1);
                break;
            }
            case 5:{
                nuevo=vierte43(e);
                if(nuevo!=null) nuevo.setCoste(1);
                break;
            }
        }
        return nuevo;
    }


    public boolean esFinal(Estado o) {
        eGarrafas e= (eGarrafas) o;
        return e.getSituacion() == e.getSolucion();
    }

    @Override
    public boolean esInicial(Estado e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public boolean esPeligro(Estado e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }


}
